- 
                Notifications
    You must be signed in to change notification settings 
- Fork 5.5k
DocuGenerate - new components #18164
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| The latest updates on your projects. Learn more about Vercel for GitHub. 2 Skipped Deployments
 | 
| WalkthroughAdds a DocuGenerate integration: an axios-based HTTP client and API methods in the app, new actions for templates and documents (list, get, delete, update, generate), README Getting Started content, and package metadata updates. Changes
 Sequence Diagram(s)sequenceDiagram
  autonumber
  actor User
  participant PD as Pipedream Action
  participant App as DocuGenerate App Adapter
  participant API as DocuGenerate API
  rect rgba(200,230,255,0.25)
  note over User,PD: Generate Document flow
  User->>PD: Provide templateId, data, name?, format?
  PD->>App: generateDocument($, {template_id, name, output_format, data})
  App->>App: makeRequest(POST /v1/documents)
  App->>API: Authorization + JSON body
  API-->>App: 201 Created { id, ... }
  App-->>PD: Response
  PD-->>User: $summary "Successfully generated document <id>"
  end
sequenceDiagram
  autonumber
  participant UI as Pipedream UI (Prop Options)
  participant App as DocuGenerate App Adapter
  participant API as DocuGenerate API
  rect rgba(220,255,220,0.25)
  note over UI,App: Dynamic Template selector
  UI->>App: options() for templateId
  App->>App: listTemplates()
  App->>API: GET /v1/templates
  API-->>App: [ {id,name}, ... ]
  App-->>UI: Map to [{label:name, value:id}]
  end
sequenceDiagram
  autonumber
  actor User
  participant PD as Pipedream Action
  participant App as DocuGenerate App Adapter
  participant API as DocuGenerate API
  rect rgba(255,235,200,0.25)
  note over User,API: Document update and delete
  User->>PD: Update Document (documentId, name)
  PD->>App: updateDocument($, documentId, {name})
  App->>API: PATCH /v1/documents/:id
  API-->>App: 200 OK
  App-->>PD: Response
  User->>PD: Delete Document (documentId)
  PD->>App: deleteDocument($, documentId)
  App->>API: DELETE /v1/documents/:id
  API-->>App: 204 No Content
  App-->>PD: Response
  end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
 Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. ✨ Finishing Touches🧪 Generate unit tests
 Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit: 
 SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type  Other keywords and placeholders
 CodeRabbit Configuration File ( | 
| Thank you so much for submitting this! We've added it to our backlog to review, and our team has been notified. | 
| Thanks for submitting this PR! When we review PRs, we follow the Pipedream component guidelines. If you're not familiar, here's a quick checklist: 
 | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (19)
components/docugenerate/package.json (1)
11-11: Add repository and license metadata.Helps consumers trace issues and ensures license compliance in registries.
Apply this diff:
"homepage": "https://pipedream.com/apps/docugenerate", "author": "DocuGenerate <[email protected]> (https://www.docugenerate.com/)", + "repository": { + "type": "git", + "url": "https://github.com/PipedreamHQ/pipedream.git" + }, + "license": "MIT",components/docugenerate/docugenerate.app.mjs (5)
36-43: Add sane defaults for timeout and transient-retry.Network hiccups and brief rate limits (429/5xx) are common. Pipedream Axios supports
retryandretryDelay.Apply this diff:
const config = { method, url: `${this.getBaseUrl()}${path}`, headers: this.getHeaders(), + timeout: 30_000, + retry: 3, + retryDelay: 1000, ...args, };
11-17: Harden options() for response shape and large accounts; bind through app.If the API wraps results (e.g.,
{ data: [...] }) this will throw. Also, some orgs have many templates—consider supporting pagination and search.Apply this diff:
async options() { - const response = await this.listTemplates(); - return response.map(template => ({ - label: template.name, - value: template.id, - })); + // Ensure we call through the app (safe in all contexts) + const response = await this.listTemplates?.() ?? await this.app.listTemplates(); + const templates = Array.isArray(response) + ? response + : Array.isArray(response?.data) + ? response.data + : Array.isArray(response?.templates) + ? response.templates + : []; + return templates.map((t) => ({ + label: t.name ?? t.id, + value: t.id, + })); },If DocuGenerate supports server-side pagination or search, we can switch to the paged options pattern:
async options({ page = 0, search } = {}) { const res = await this.app.listTemplates(this, { params: { page, search } }); const items = res.data ?? res; return { options: items.map(t => ({ label: t.name, value: t.id })), nextPageToken: items.length ? page + 1 : null, }; }
63-67: Use Axios params to ensure proper URL encoding.Safer than string concatenation, prevents encoding bugs.
Apply this diff:
- return this.makeRequest({ - $, - path: `/document?template_id=${templateId}`, - }); + return this.makeRequest({ + $, + path: `/document`, + params: { template_id: templateId }, + });
90-96: Binary downloads and Accept header (for formats like PDF/PNG).If
generateDocumentorgetDocumentreturns binary content, you’ll needresponseType: "arraybuffer"and anAcceptheader, otherwise Axios will try to parse as JSON. If the API returns JSON metadata only, ignore.Example change (only if API returns binary):
async generateDocument($ = this, body) { return this.makeRequest({ $, method: "POST", path: "/document", - data: body, + data: body, + headers: { ...this.getHeaders(), Accept: "*/*" }, + responseType: "arraybuffer", }); },Alternatively, gate via an action prop (e.g.,
download: boolean) and conditionally setresponseType.
24-29: Authorization header needsBearerschemeDocugenerate’s
getHeaders()currently emits:getHeaders() { return { "Authorization": `${this.$auth.api_key}`, "Content-Type": "application/json", }; }However, nearly every other component prefixes its auth key with
Bearer, for example:// Frontapp "Authorization": `Bearer ${this.$auth.oauth_access_token}`, // Fullenrich "Authorization": `Bearer ${this.$auth.api_key}`,To align with this convention and support APIs expecting the standard
Bearer <token>format, updategetHeaders()to:getHeaders() { return { - "Authorization": `${this.$auth.api_key}`, + "Authorization": this.$auth?.api_key?.startsWith("Bearer ") + ? this.$auth.api_key + : `Bearer ${this.$auth.api_key}`, "Content-Type": "application/json", }; }This defensively prepends
Beareronly when it’s missing.components/docugenerate/actions/delete-template.mjs (1)
19-22: Surface clearer summaries on common failure modes (404/409).Optional: wrap with try/catch to emit user-friendly summaries while preserving error context.
Apply this diff:
async run({ $ }) { - const response = await this.app.deleteTemplate($, this.templateId); - - $.export("$summary", `Successfully deleted the template ${this.templateId}`); - return response; + try { + const response = await this.app.deleteTemplate($, this.templateId); + $.export("$summary", `Successfully deleted template ${this.templateId}`); + return response; + } catch (err) { + if (err?.response?.status === 404) { + $.export("$summary", `Template not found: ${this.templateId}`); + } + throw err; + } },components/docugenerate/actions/get-document.mjs (2)
11-16: Provide a dropdown for documents (and filter by template).Typing raw IDs isn’t ergonomic. Recommend adding an optional
templateIdand bindingdocumentIdoptions tolistDocuments.Apply this diff:
props: { app, + templateId: { + propDefinition: [ + app, + "templateId", + ], + optional: true, + }, - documentId: { - type: "string", - label: "Document", - description: "The ID of the document", - }, + documentId: { + type: "string", + label: "Document", + description: "Select a document or enter an ID", + async options() { + if (!this.templateId) return []; + const res = await this.app.listDocuments($, this.templateId); + const docs = Array.isArray(res?.data) ? res.data : res; + return docs.map((d) => ({ + label: d.name ? `${d.name} (${d.id})` : d.id, + value: d.id, + })); + }, + }, },Also consider a boolean prop like
downloadFileto switch the underlyinggetDocumentcall toresponseType: "arraybuffer"when retrieving binaries.
18-21: Avoid returning large/binary payloads directly.Returning full document bytes can bloat step results. Consider returning metadata and, if downloading, writing to a temporary file and returning a path or emitting as a file.
Example pattern:
const res = await this.app.getDocument($, this.documentId, { responseType: "arraybuffer" }); // write to tmp file using fs, then return { file_path, content_type }components/docugenerate/actions/delete-document.mjs (2)
1-23: Action is clean and consistent; minor UX upgrades possible.Looks good. Consider mirroring the document dropdown enhancement from Get Document for consistency (add optional
templateIdand dynamicdocumentId).
17-21: Handle 404 with a clearer summary; avoid empty response confusion (204).DELETE commonly returns 204 with no body. Make the summary explicit and handle not-found errors gracefully.
Apply this diff:
async run({ $ }) { - const response = await this.app.deleteDocument($, this.documentId); - - $.export("$summary", `Successfully deleted the document ${this.documentId}`); - return response; + try { + const response = await this.app.deleteDocument($, this.documentId); + $.export("$summary", `Deleted document ${this.documentId}`); + // Some APIs return 204 No Content; normalize truthy result for UI + return response ?? { success: true, id: this.documentId }; + } catch (err) { + if (err?.response?.status === 404) { + $.export("$summary", `Document not found: ${this.documentId}`); + } + throw err; + } },components/docugenerate/actions/get-template.mjs (1)
18-23: Prefer showing template name in the summary when availableIf the API returns a
name, use it; otherwise fall back to the ID.Apply this diff:
- const response = await this.app.getTemplate($, this.templateId); - - $.export("$summary", `Successfully retrieved the template ${this.templateId}`); - return response; + const response = await this.app.getTemplate($, this.templateId); + const display = response?.name || this.templateId; + $.export("$summary", `Successfully retrieved the template ${display}`); + return response;components/docugenerate/actions/list-documents.mjs (1)
18-23: Harden summary and return shape; support future pagination (optional)The
runmethod in components/docugenerate/actions/list-documents.mjs currently does:const response = await this.app.listDocuments($, this.templateId); $.export("$summary", `Successfully retrieved ${response?.length || 0} documents`); return response;
listDocumentssimply forwards tomakeRequest, which uses Pipedream’s axios wrapper and returns only the response body (data) of the API call (pipedream.com).- There’s no pagination support (
page,limit, orcursor) in the SDK, so if the API later wraps results in{ data: [...] }or adds metadata, the current summary/count will break or misreport.Optional refactor to future-proof:
- const response = await this.app.listDocuments($, this.templateId); - $.export("$summary", `Successfully retrieved ${response?.length || 0} documents`); - return response; + const response = await this.app.listDocuments($, this.templateId); + // Normalize array vs. wrapped { data: [...] } shape + const items = Array.isArray(response) ? response : (response?.data ?? []); + const count = items.length; + $.export("$summary", `Successfully retrieved ${count} document${count === 1 ? "" : "s"}`); + return items;components/docugenerate/actions/update-document.mjs (2)
22-29: Validate non-empty name and trim before sendingPrevent accidental blank names and reduce downstream API errors.
Apply this diff:
- const response = await this.app.updateDocument($, this.documentId, { - name: this.name - }); - - $.export("$summary", `Successfully updated the document ${this.documentId}`); + if (!this.name || !this.name.trim()) { + throw new Error("Name is required and cannot be empty."); + } + const response = await this.app.updateDocument($, this.documentId, { + name: this.name.trim(), + }); + const display = response?.name || this.documentId; + $.export("$summary", `Successfully updated the document ${display}`); return response;
11-15: Add a shareddocumentIdpropDefinition for better UXTo enable a dropdown when selecting an existing document (similar to
templateId), let’s definedocumentIdonce in your app’s propDefinitions and then reference it in each action.Points of attention:
- File:
components/docugenerate/docugenerate.app.mjs
• UnderpropDefinitions, alongsidetemplateId- File:
components/docugenerate/actions/update-document.mjs(and any other actions usingdocumentId)
• Replace the inline schema with apropDefinitionreferenceExample diff in
docugenerate.app.mjs:propDefinitions: { templateId: { type: "string", label: "Template", description: "The ID of the template", }, + documentId: { + type: "string", + label: "Document", + description: "The ID of the document", + }, },Example diff in
update-document.mjs(lines 11–15):- documentId: { - type: "string", - label: "Document", - description: "The ID of the document", - }, + documentId: { + propDefinition: [APP, "documentId"], + },This optional refactor centralizes your schema, reduces duplication, and enables a dropdown selector for better usability. Let me know if you’d like me to implement these changes!
components/docugenerate/actions/generate-document.mjs (2)
43-55: Default format to .docx in code and improve summary fallbackDescription says it defaults to .docx, but the code passes
undefinedif not set. Also, ifresponse.idis absent, summary becomes “undefined”.Apply this diff:
- const body = { - template_id: this.templateId, - name: this.name, - output_format: this.format, - data: this.data, - }; + const outputFormat = this.format || ".docx"; + const body = { + template_id: this.templateId, + ...(this.name ? { name: this.name } : {}), + output_format: outputFormat, + data: this.data, + }; @@ - $.export("$summary", `Successfully generated the document ${response.id}`); - return response; + const display = response?.id || this.name || this.templateId; + $.export("$summary", `Successfully generated the document ${display}`); + return response;
23-36: Confirm API’s expected format key and value mappingOur inspection shows that the
generateDocumentclient method simply forwards theformatfield (including its leading dot) as-is—there’s nooutput_formatmapping in the client code. You’ll need to verify against the backend’s API specification whether:
- The request payload should use a
formatkey or anoutput_formatkey.- The value should include the leading dot (e.g.
application/pdf).If the API does expect a different field name or value format, add a small mapping in
components/docugenerate/actions/generate-document.mjsto transform the user-selected option before invokinggenerateDocument. For example:--- a/components/docugenerate/actions/generate-document.mjs +++ b/components/docugenerate/actions/generate-document.mjs @@ (inside the action handler) - const response = await client.generateDocument({ documentId }, { format }); + const apiBody = { + // map “format” → “output_format” and strip leading dot if needed + output_format: format.replace(/^\./, ''), + }; + const response = await client.generateDocument({ documentId }, apiBody);• File: components/docugenerate/actions/generate-document.mjs
• Section:format.options→ mapping beforegenerateDocumentcallcomponents/docugenerate/README.md (2)
23-26: Clarify auth flow and add a short security noteRecommend explicitly stating that users should authenticate via a Pipedream connection and avoid pasting keys in step inputs/logs.
Apply this diff:
1. In your Pipedream workflow, add a DocuGenerate action 2. When prompted for authentication, paste your API Key 3. Test the connection by using the "List Templates" action + +> Security note: Pipedream stores connected accounts encrypted. Avoid pasting API keys into step inputs or logs—use the connected DocuGenerate account for all actions.
29-33: Enumerate supported output formats, improve list rendering, and show a JSON exampleThis makes the action options unambiguous and addresses the minor grammar warning flagged by tooling by inserting a blank line after the intro line.
Apply this diff:
-Use the "Generate Document" action with: +Use the "Generate Document" action with: + -- **Template**: Select from your available templates -- **Data**: Provide JSON data matching your template merge tags (e.g., `{ "name": "John Doe" }`) +- **Template**: Select from your available templates (the dropdown is populated from your DocuGenerate account) +- **Data**: Provide JSON data matching your template merge tags. Example: + +```json +{ + "name": "John Doe" +} +``` - **Name**: Set a custom document name (optional) -- **Format**: Choose your desired output format (optional) +- **Format**: Choose your desired output format (optional). Supported formats: PDF, DOCX, DOC, ODT, TXT, PNG.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (11)
- components/docugenerate/README.md(1 hunks)
- components/docugenerate/actions/delete-document.mjs(1 hunks)
- components/docugenerate/actions/delete-template.mjs(1 hunks)
- components/docugenerate/actions/generate-document.mjs(1 hunks)
- components/docugenerate/actions/get-document.mjs(1 hunks)
- components/docugenerate/actions/get-template.mjs(1 hunks)
- components/docugenerate/actions/list-documents.mjs(1 hunks)
- components/docugenerate/actions/list-templates.mjs(1 hunks)
- components/docugenerate/actions/update-document.mjs(1 hunks)
- components/docugenerate/docugenerate.app.mjs(1 hunks)
- components/docugenerate/package.json(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (7)
components/docugenerate/actions/list-documents.mjs (8)
components/docugenerate/actions/delete-document.mjs (1)
response(18-18)components/docugenerate/actions/delete-template.mjs (1)
response(19-19)components/docugenerate/actions/generate-document.mjs (1)
response(51-51)components/docugenerate/actions/get-document.mjs (1)
response(18-18)components/docugenerate/actions/get-template.mjs (1)
response(19-19)components/docugenerate/actions/list-templates.mjs (1)
response(13-13)components/docugenerate/actions/update-document.mjs (1)
response(23-25)components/docugenerate/docugenerate.app.mjs (1)
response(12-12)
components/docugenerate/actions/get-document.mjs (6)
components/docugenerate/actions/delete-document.mjs (1)
response(18-18)components/docugenerate/actions/generate-document.mjs (1)
response(51-51)components/docugenerate/actions/get-template.mjs (1)
response(19-19)components/docugenerate/actions/list-documents.mjs (1)
response(19-19)components/docugenerate/actions/list-templates.mjs (1)
response(13-13)components/docugenerate/actions/update-document.mjs (1)
response(23-25)
components/docugenerate/actions/list-templates.mjs (4)
components/docugenerate/actions/generate-document.mjs (1)
response(51-51)components/docugenerate/actions/get-template.mjs (1)
response(19-19)components/docugenerate/actions/list-documents.mjs (1)
response(19-19)components/docugenerate/docugenerate.app.mjs (1)
response(12-12)
components/docugenerate/actions/get-template.mjs (3)
components/docugenerate/actions/delete-template.mjs (1)
response(19-19)components/docugenerate/actions/get-document.mjs (1)
response(18-18)components/docugenerate/actions/list-templates.mjs (1)
response(13-13)
components/docugenerate/actions/delete-document.mjs (8)
components/docugenerate/actions/delete-template.mjs (1)
response(19-19)components/docugenerate/actions/generate-document.mjs (1)
response(51-51)components/docugenerate/actions/get-document.mjs (1)
response(18-18)components/docugenerate/actions/get-template.mjs (1)
response(19-19)components/docugenerate/actions/list-documents.mjs (1)
response(19-19)components/docugenerate/actions/list-templates.mjs (1)
response(13-13)components/docugenerate/actions/update-document.mjs (1)
response(23-25)components/docugenerate/docugenerate.app.mjs (1)
response(12-12)
components/docugenerate/actions/delete-template.mjs (3)
components/docugenerate/actions/delete-document.mjs (1)
response(18-18)components/docugenerate/actions/get-template.mjs (1)
response(19-19)components/docugenerate/actions/list-templates.mjs (1)
response(13-13)
components/docugenerate/docugenerate.app.mjs (8)
components/docugenerate/actions/delete-document.mjs (1)
response(18-18)components/docugenerate/actions/delete-template.mjs (1)
response(19-19)components/docugenerate/actions/generate-document.mjs (2)
response(51-51)
body(44-49)components/docugenerate/actions/get-document.mjs (1)
response(18-18)components/docugenerate/actions/get-template.mjs (1)
response(19-19)components/docugenerate/actions/list-documents.mjs (1)
response(19-19)components/docugenerate/actions/list-templates.mjs (1)
response(13-13)components/docugenerate/actions/update-document.mjs (1)
response(23-25)
🪛 LanguageTool
components/docugenerate/README.md
[grammar] ~29-~29: There might be a mistake here.
Context: ...Use the "Generate Document" action with: - Template: Select from your available t...
(QB_NEW_EN)
🔇 Additional comments (10)
components/docugenerate/package.json (1)
3-3: Version bump to 1.0.0 makes sense (new public API surface).No issues. Semantic versioning aligns with the added actions and app client.
components/docugenerate/docugenerate.app.mjs (1)
75-81: Confirm update verb and partial update semantics (PUT vs PATCH).If the API performs partial updates,
PATCHis usually the correct verb. IfPUTrequires the full resource, callers may inadvertently clear fields.Apply this diff if the API supports partial updates:
async updateDocument($ = this, documentId, body) { return this.makeRequest({ $, - method: "PUT", + method: "PATCH", path: `/document/${documentId}`, data: body, }); },components/docugenerate/actions/delete-template.mjs (1)
1-24: Action structure looks solid and consistent with others.Good use of app propDefinition, versioning, and summary export.
components/docugenerate/actions/list-templates.mjs (2)
3-11: Action skeleton and props look goodKey/name/description/type/props align with Pipedream conventions. Import path is correct.
13-16: Verify DocuGenerate GET /template response shape
Pipedream’saxios($, config)wrapper returns only the HTTP response body (the JSON payload) by default (pipedream.com). In ourlistTemplates()method, that means we get back exactly what the/templateendpoint returns. If it always returns an array of template objects—as implied by theoptions()call on it inpropDefinitions—thenresponse?.lengthis correct. However, if that endpoint ever switches to wrapping its array in an object (for example,{ data: […] }), both the summary and the.map()inoptions()will break (docugenerate.com).To guard against a future change in response shape, you can apply this optional refactor:
- const response = await this.app.listTemplates($); - $.export("$summary", `Successfully retrieved ${response?.length || 0} templates`); - return response; + const response = await this.app.listTemplates($); + // Ensure we always work with the array of templates, whether the API returns [] or { data: [] } + const items = Array.isArray(response) ? response : response?.data ?? []; + const count = items.length; + $.export( + "$summary", + `Successfully retrieved ${count} template${count === 1 ? "" : "s"}` + ); + return items;Please confirm the actual shape of the
/templateresponse in the DocuGenerate API docs or via a quick test before merging.components/docugenerate/actions/get-template.mjs (1)
3-17: Solid action definitionProps reuse the app’s
templateIdpropDefinition—good for UX consistency. No issues spotted here.components/docugenerate/actions/list-documents.mjs (1)
3-17: Good alignment with templateId propDefinitionThe action structure mirrors List Templates/Get Template—consistent and clear.
components/docugenerate/actions/update-document.mjs (1)
3-21: Action definition is straightforwardMinimal props and a clear contract. Looks good as a base.
components/docugenerate/actions/generate-document.mjs (1)
3-16: Well-structured action with dynamic template selectionProps and overall wiring look correct. Good coverage of common fields.
components/docugenerate/README.md (1)
13-14: Nice addition: clear "Getting Started" anchor for new usersAdding this section improves onboarding flow and complements the new actions well. No changes needed here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (1)
components/docugenerate/README.md (1)
17-19: Tighten wording and standardize “API key” casingMinor phrasing/casing tweak and preposition fix.
Apply this diff:
-1. Sign up for a [DocuGenerate](https://www.docugenerate.com/) account -2. Get your unique API Key from the Developers tab in the [Settings](https://app.docugenerate.com/settings/developers) page -3. Copy the API Key for use in Pipedream +1. Sign up for a [DocuGenerate](https://www.docugenerate.com/) account +2. Get your API key from the Developers tab on the [Settings](https://app.docugenerate.com/settings/developers) page +3. Copy the API key for use in Pipedream
🧹 Nitpick comments (2)
components/docugenerate/README.md (2)
23-25: Clarify action example and verb choiceUse “run” for actions and provide an inline example to guide first-time users.
Apply this diff:
-1. In your Pipedream workflow, add a DocuGenerate action -2. When prompted for authentication, paste your API Key -3. Test the connection by using the "List Templates" action +1. In your Pipedream workflow, add a DocuGenerate action (e.g., List Templates) +2. When prompted for authentication, paste your API key +3. Test the connection by running the "List Templates" action
29-33: Improve readability and surface supported formats inlineUse backticks for UI action names, move JSON into a fenced block, and explicitly list supported formats.
Apply this diff:
-Use the "Generate Document" action with: +Use the `Generate Document` action with: - **Template**: Select from your available templates -- **Data**: Provide JSON data matching your template merge tags (e.g., `{ "name": "John Doe" }`) +- **Data**: Provide JSON matching your template merge tags, for example: + +```json +{ "name": "John Doe" } +``` - **Name**: Set a custom document name (optional) -- **Format**: Choose your desired output format (optional) +- **Format**: Choose your desired output format (optional). Supported: PDF, DOCX, DOC, ODT, TXT, PNG
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (1)
- components/docugenerate/README.md(1 hunks)
🧰 Additional context used
🪛 LanguageTool
components/docugenerate/README.md
[grammar] ~29-~29: There might be a mistake here.
Context: ...Use the "Generate Document" action with: - Template: Select from your available t...
(QB_NEW_EN)
🔇 Additional comments (1)
components/docugenerate/README.md (1)
13-16: Getting Started section reads well and aligns with the new actionsClear structure and headings; matches the integration surface described in the PR.
| Hi, thanks for the submission! I've noted this and will review it as soon as possible. | 
| Hi @GTFalcao, That's awesome, thank you for the update! Best regards, | 
| Hi @docugenerate , for your convenience I've made a few adjustments to your PR so that your components follow the standards of other Pipedream components, and can be properly published after this is merged: 
 | 
| documentId: { | ||
| type: "string", | ||
| label: "Document", | ||
| description: "The ID of the document", | ||
| }, | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we add async options to the documentId prop and reuse it as a propDefinition, in the same fashion as was done with templateId?
I see the API allows listing documents, so this shouldn't be a problem, and would make for much better usability
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you, @GTFalcao this is highly appreciated!
For the documentId we'd like to keep it as is if possible. The number of templates is usually reasonably small, so a dropdown for the templates is a great UX choice. However, there can be a lot of generated documents for a given template, so just using the ID for documents is simpler. Hope this makes sense.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see @docugenerate , no problem. Pipedream's workflow UI has a search filter to help narrow down the options precisely for these large options.
Should you ever add pagination or a query/search parameter, both of these are supported in our options model as well.
In any case, we can leave it as it is if you believe it is fine for your use case. I'll move the PR forward to QA
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good, thank you @GTFalcao! Appreciate your help with getting our PR merged 👍
| Hi everyone, all test cases are passed! Ready for release! Test report | 
| @docugenerate the sample request in each app is almost always the simplest GET available, preferably without needing any user input. In this case Generate Document goes a bit beyond the basic complexity, since it needs a template ID input and is not as well suited for a sample/test request. Does that make sense? | 
| Thank you @GTFalcao, that makes perfect sense! We can leave the sample request as it is then 👍 | 
| Thanks for the thoughtful clarification, @GTFalcao, that makes perfect sense. Just to add a bit of context from our side: the test request shown in an app’s page on the Pipedream App Store is primarily designed to validate the user’s API credentials and confirm that the connection is working. When possible, we also aim for it to help identify the authenticated user... for example, confirming that the credentials entered are tied to the expected account. That’s why endpoints like  If @docugenerate ever supports an endpoint like that in their API, we’d be happy to update the test request shown on their app page. Feel free to ping us anytime. Thanks again!     | 
| That's perfect, thank you @sergio-eliot-rodriguez! | 

Summary
This PR updates the DocuGenerate integration to Pipedream with the following actions:
Actions
Features
Testing
All actions have been tested and published successfully using the Pipedream CLI.
Summary by CodeRabbit